package com.ossfk.jt808.pojo;

import java.io.Serializable;

import com.ossfk.net.utils.Bcd8421Helper;
import com.ossfk.net.utils.ByteHelper;

import lombok.Data;

@Data
public class Jt808MsgHeader implements Serializable{
	
	private static final long serialVersionUID = -6705711124435691373L;
	/** 消息头最小字节数 */
	public static final int HEADER_MIN_LENGTH = 12;

	/** 消息ID */
	private int msgId;

	/////// ========消息体属性 start
	/** byte[2-3] */
	private int msgBodyPropsField;
	/** 消息体长度 */
	private int msgBodyLength;
	/** 数据加密方式 */
	private int encryptionType;
	/** 是否分包,true==>有消息包封装项 */
	private boolean hasSubPackage;
	/** 保留位[14-15] */
	private String reservedBit;
	/////// ========消息体属性 end

	/* 终端手机号 */
	private String terminalPhone;
	/* 流水号 */
	private int flowId;

	//////// =====消息包封装项 start
	/** 消息包封装项字段byte[12-15] */
	private int packageInfoField;
	/** 消息包总数(word(16)) */
	private long totalSubPackage;
	/** 包序号(word(16))这次发送的这个消息包是分包中的第几个消息包, 从 1 开始 */
	private long subPackageSeq;
	//////// =====消息包封装项 end
	
	public static Jt808MsgHeader bytes2Object(byte[] data) {
		Jt808MsgHeader msgHeader = new Jt808MsgHeader();
		// 1. 消息ID word(16)
		msgHeader.setMsgId(ByteHelper.byteToInteger(data, 0, 2));
		// 2. 消息体属性 word(16)=================>
		int msgBodyProps = ByteHelper.byteToInteger(data, 2, 2);
		msgHeader.setMsgBodyPropsField(msgBodyProps);
		// [ 0-9 ] 0000,0011,1111,1111(3FF)(消息体长度)
		msgHeader.setMsgBodyLength(msgBodyProps & 0x3ff);
		// [10-12] 0001,1100,0000,0000(1C00)(加密类型)
		msgHeader.setEncryptionType((msgBodyProps & 0x1c00) >> 10);
		// [ 13_ ] 0010,0000,0000,0000(2000)(是否有子包)
		msgHeader.setHasSubPackage(((msgBodyProps & 0x2000) >> 13) == 1);
		// [14-15] 1100,0000,0000,0000(C000)(保留位)
		msgHeader.setReservedBit(((msgBodyProps & 0xc000) >> 14) + "");
		// 消息体属性 word(16)<=================
		// 3. 终端手机号 bcd[6]
		msgHeader.setTerminalPhone(Bcd8421Helper.parseBcdStringFromBytes(data, 4, 6));
		// 4. 消息流水号 word(16) 按发送顺序从 0 开始循环累加
		msgHeader.setFlowId(ByteHelper.byteToInteger(data, 10, 2));
		// 5. 消息包封装项
		// 有子包信息
		if (msgHeader.isHasSubPackage()) {
			// 消息包封装项字段
			msgHeader.setPackageInfoField(ByteHelper.byteToInteger(data, 12, 4));
			// byte[0-1] 消息包总数(word(16))
			msgHeader.setTotalSubPackage(ByteHelper.byteToInteger(data, 12, 2));
			// byte[2-3] 包序号(word(16)) 从 1 开始
			msgHeader.setSubPackageSeq(ByteHelper.byteToInteger(data, 14, 2));
		}
		return msgHeader;
	}
}
